package br.gov.serpro.treino.exception;
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import br.gov.serpro.treino.view.managedbean.FacesUtil;
public class GridExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler exceptionHandler;
public GridExceptionHandler(ExceptionHandler exceptionHandler) {
this.exceptionHandler = exceptionHandler;
}
@Override
public ExceptionHandler getWrapped() {
return this.exceptionHandler;
}
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent exceptionQueuedEvent = i.next();
ExceptionQueuedEventContext exceptionQueuedEventContext = (ExceptionQueuedEventContext) exceptionQueuedEvent.getSource();
Throwable throwable = exceptionQueuedEventContext.getException();
if (throwable instanceof Throwable) {
Throwable t = (Throwable) throwable;
if (t.getCause() instanceof TestGridException) {
TestGridException e = (TestGridException) t.getCause();
FacesUtil.addMessage(e.getObjectMessage(), e.getParams());
} else if(t instanceof ViewExpiredException){
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
try {
fc.getExternalContext().getFlash().put("expiredViewId", vee.getViewId());
nav.handleNavigation(fc, null, "/private/pages/index?faces-redirect=true");
fc.renderResponse();
} finally {
i.remove();
}
}else {
String[] param = { throwable.getMessage() };
FacesUtil.addMessage(ErrorMessage.UNEXPECTED, param, throwable);
}
}
}
}
}